package $3exceptionhandler;

public class FnThrow {

    public static void main(String[] args) throws Exception {
        // 抛出异常 throw
        // 异常的传播：当某个方法抛出了异常时，如果当前方法没有捕获异常，异常就会被抛到上层调用方法，直到遇到某个try ... catch被捕获为止。
        // 通过printStackTrace()可以打印出方法的调用栈

        try {
            process1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 在极少数的情况下，我们需要获知所有的异常。如何保存所有的异常信息？
        // 方法是先用origin变量保存原始异常，然后调用Throwable.addSuppressed()，把原始异常添加进来，最后在finally抛出
        Exception origin = null;
        try {
            System.out.println(Integer.parseInt("abc"));
        } catch (Exception e) {
            origin = e;
            throw e;
        } finally {
            Exception e = new IllegalArgumentException();
            if (origin != null) {
                e.addSuppressed(origin);
            }
            throw e;
        }
    }

    private static void process1() {
        process2();

    }

    private static void process2() {
        // TODO Auto-generated method stub
        Integer.parseInt(null); // 会抛出NumberFormatException
    }
    void process3(String s) {
        if (s==null) {
//            NullPointerException e = new NullPointerException();
//            throw e;
            // 绝大部分抛出异常的代码都会合并写成一行
            throw new NullPointerException();
        }
    }
}
